26 某国际电商平台销售数据分析
26.1 引言电商数据的多维度分析
电商平台关键问题: - 折扣策略: 多大折扣最优? - 利润分析: 折扣与利润关系 - 品类表现: 哪些品类利润高? - 定价策略: 如何平衡销量与利润
26.2 数据准备
平台任务解答代码
以下代码与教学平台任务要求完全一致:
# 注:superstore.xlsx 数据文件本地没有,但平台已经内置
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
# 导入必要的包
import pandas as pd # 用于数据处理和分析
import matplotlib.pyplot as plt # 用于绘图
import seaborn as sns # 用于高级绘图
from datetime import datetime # 用于处理日期时间数据
# 读取Excel文件
data = pd.read_excel('superstore.xlsx')
# 删除Postal Code字段
del data['Postal Code']
print(data.head()) # 输出前几行数据
# 折扣与销售利润关系探究
# 判断每一天是不是同一个折扣
huigui01 = data.groupby('Order Date').Discount.nunique()
print(huigui01.head()) # 输出前几行数据
# 判断每个品类的折扣情况
huigui03 = data.groupby(['Sub-Category', 'Discount']).agg({
'Profit': 'sum', # 计算每个子类别和折扣组合的总利润
'Order Date': 'nunique', # 计算每个子类别和折扣组合的唯一订单日期数量
}) # 数据结构定义结束
huigui03['Profit_pd'] = huigui03['Profit'] / huigui03['Order Date'] # 计算单位时间内的平均利润
print(huigui03.head(15)) # 打印前15行结果,检查每个子类别和折扣组合的利润情况
# 通过前面的判断,可以发现:
# 1)同一天不同商品会采取不同的折扣;
# 2)不同品类的商品,折扣力度也并不相同;
# 为了简化问题,我们将所有销售数据按照折扣分组,然后对销量、销售额、利润等数据进行汇总聚合;
# 同时,考虑到折扣促销的本质,就是为了通过降价提高销量,相应单个产品的利润会有所下降,但是单个品类、单位时间的利润总和会得到提升;
# 因此我们在探究折扣与利润之间关系时候,需要剔除品类数量、折扣时间的影响。
# 按折扣分组,计算汇总指标
profit_8discount = data.groupby('Discount').agg({
'Quantity': 'sum', # 计算每个折扣下的总销售数量
'Sales': 'sum', # 计算每个折扣下的总销售额
'Profit': 'sum', # 计算每个折扣下的总利润
'Order Date': 'nunique', # 计算每个折扣下的唯一订单日期数量
'Product Name': 'nunique', # 计算每个折扣下的唯一商品名称数量
}) # 数据结构定义结束
# 重命名列
profit_8discount.columns = ['Quantity_sum', 'Sales_sum', 'Profit_sum', 'Dates_sum', 'Products_sum']
# 计算单位时间内每个商品的平均利润、平均销售额和平均销售数量
profit_8discount['Profit_p_p'] = profit_8discount['Profit_sum'] / profit_8discount['Products_sum'] / profit_8discount['Dates_sum'] # 平均利润
profit_8discount['Sales_p_p'] = profit_8discount['Sales_sum'] / profit_8discount['Products_sum'] / profit_8discount['Dates_sum'] # 平均销售额
profit_8discount['Quantity_p_p'] = profit_8discount['Quantity_sum'] / profit_8discount['Products_sum'] / profit_8discount['Dates_sum'] # 平均销售数量
# 重置索引,方便后续操作
profit_8discount = profit_8discount.reset_index()
print(profit_8discount) # 输出利润数据
# 选取折扣涉及商品种类大于(商品种类总数)*0.005的情形;
profit_8discount22 = profit_8discount.query('Products_sum > 19')
print(profit_8discount22) # 输出利润数据
# 绘制折扣与利润关系的折线图
sns.set(style="darkgrid") # 设置绘图风格为'darkgrid'
plt.figure(figsize=(10, 6)) # 设置画布大小
# 遍历需要绘制的列(平均利润、平均销售额、平均销售数量)
for i in profit_8discount22.columns[6:-2]:
ax = sns.lineplot(x='Discount', y=i, label=i, data=profit_8discount22) # 绑制折线图
# 添加图例和标签
plt.legend() # 显示图例
plt.xlabel('Discount Range') # 设置x轴标签
plt.ylabel('Sales') # 设置y轴标签
plt.savefig("10.png") # 保存图表为PNG文件
plt.show() # 显示图表
# 通过分析发现:
# 1)销售折扣20%(折扣为0.2表示打8折(即降价20%))是销售利润正负的拐点,当折扣继续增加,销售利润基本为负值。
# 2)当折扣为0.002和0.07时,单个品类单位时间的总利润有显著的提升,也就是营销中低折扣的“小刀”策略,可以有效刺激消费者购买欲望,进而提升销量和利润。
# 3)当折扣为0.85、0.55、0.57的时候,利润会出现一些极端的负数值,通过查看对应的商品种类和该折扣销售天数,
# 可以发现此种情况是特殊个例,属于基于特定商品、网红商品的引流活动,对整体商品的定价策略不具备代表性。# 注:superstore.xlsx 数据文件本地没有,但平台已经内置
# =============================================================================
# 题目:国际电商平台销售数据预处理与清洗
# =============================================================================
# 本代码块实现电商销售数据的读取、清洗和初步探索
# 重点处理缺失值和异常值,为后续分析奠定基础
# ==================== 导入数据分析库 ====================
import pandas as pd # 导入Pandas库,用于数据表操作
import matplotlib.pyplot as plt # 导入Matplotlib库,用于绘图
import seaborn as sns # 导入Seaborn库,用于高级统计绘图
from datetime import datetime # 导入datetime模块,用于日期时间处理
# ==================== 读取电商平台销售数据 ====================
data = pd.read_excel('superstore.xlsx') # 读取Excel格式的销售数据文件
# ==================== 数据清洗:删除缺失值过多的字段 ====================
del data['Postal Code'] # 删除邮政编码字段,因为该字段缺失值较多,对分析贡献有限
print('数据形状:', data.shape) # 输出数据集的行数和列数,了解数据规模
print('\n数据预览:') # 输出标题
print(data.head()) # 显示数据的前5行,初步了解数据结构26.3 折扣与销售利润关系探究
26.3.1 问题1每天是否采用统一折扣?
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行
# ==================== 统计每天的折扣种类数量 ====================
daily_discounts = data.groupby('Order Date').Discount.nunique()
# 按订单日期分组,统计每天有多少种不同的折扣力度
# nunique()计算唯一值的数量,用于评估折扣策略的复杂性
print('每天折扣种类数统计:') # 输出标题
print(daily_discounts.head(10)) # 显示前10天的折扣种类数
print(f'\n平均每天折扣种类数: {daily_discounts.mean():.2f}') # 输出平均每天有几种折扣,保留2位小数
print(f'最大折扣种类数: {daily_discounts.max()}') # 输出折扣种类数最多的天有几种折扣结论: 同一天不同商品会采取不同的折扣
26.3.2 问题2各品类折扣情况
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行
# ==================== 按子品类和折扣分组统计 ====================
category_discount = data.groupby(['Sub-Category', 'Discount']).agg({
'Profit': 'sum', # 对利润求和,计算该品类在该折扣力度下的总利润
'Order Date': 'nunique' # 统计不重复的日期数,计算该折扣持续的天数
})
# ==================== 计算单位时间平均利润 ====================
category_discount['Profit_per_day'] = category_discount['Profit'] / category_discount['Order Date']
# 计算每个品类在每个折扣水平下的日均利润
# 这个指标可以帮助判断哪种折扣力度更有效率
print('子品类折扣分析:') # 输出标题
print(category_discount.head(15)) # 显示前15行结果结论: 不同品类的商品,折扣力度不相同
26.3.3 问题3折扣与利润的总体关系
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行
# ==================== 按折扣分组统计多项业务指标 ====================
profit_by_discount = data.groupby('Discount').agg({
'Quantity': 'sum', # 总销量,衡量折扣对销售量的刺激作用
'Sales': 'sum', # 总销售额,衡量折扣对收入的影响
'Profit': 'sum', # 总利润,衡量折扣对盈利的影响
'Order Date': 'nunique', # 不重复的日期数,计算折扣持续天数
'Product Name': 'nunique' # 不重复的产品数,计算参与该折扣的产品种类
})
# ==================== 重命名列以提高可读性 ====================
profit_by_discount.columns = [
'Quantity_sum', # 总销量
'Sales_sum', # 总销售额
'Profit_sum', # 总利润
'Dates_sum', # 天数
'Products_sum' # 产品数
]
# ==================== 计算单位时间内每个产品的平均值 ====================
profit_by_discount['Profit_p_p'] = (
profit_by_discount['Profit_sum'] /
profit_by_discount['Products_sum'] /
profit_by_discount['Dates_sum']
)
# 计算每个产品每天的平均利润,这是衡量折扣效率的核心指标
# 利润_p_p = 总利润 / (产品数 × 天数)
profit_by_discount['Sales_p_p'] = (
profit_by_discount['Sales_sum'] /
profit_by_discount['Products_sum'] /
profit_by_discount['Dates_sum']
)
# 计算每个产品每天的平均销售额
profit_by_discount['Quantity_p_p'] = (
profit_by_discount['Quantity_sum'] /
profit_by_discount['Products_sum'] /
profit_by_discount['Dates_sum']
)
# 计算每个产品每天的平均销量
profit_by_discount = profit_by_discount.reset_index() # 重置索引,将折扣从索引转为列
# ==================== 过滤极端值 ====================
profit_filtered = profit_by_discount.query('Products_sum > 19')
# 只保留产品种类数大于19的折扣记录
# 这样可以排除样本量太小的极端折扣情况,提高分析可靠性
print('折扣与利润分析(过滤后):') # 输出标题
print(profit_filtered[['Discount', 'Profit_p_p', 'Sales_p_p', 'Quantity_p_p']])
# 只显示折扣、利润、销售额和销量的平均值,简洁展示核心结果26.3.4 可视化分析
# 注:该代码块依赖的数据来自上方平台任务代码块,因其未执行,本块也无法执行
# ==================== 设置绘图风格 ====================
sns.set(style='darkgrid') # 使用Seaborn的深色网格风格,使图表更专业
plt.figure(figsize=(10, 6)) # 创建10x6英寸的画布
# ==================== 绘制多条折线对比不同指标 ====================
metrics = ['Profit_p_p', 'Sales_p_p', 'Quantity_p_p'] # 定义要绘制的三个指标
labels = ['平均利润', '平均销售额', '平均销售数量'] # 定义每个指标的中文标签
for metric, label in zip(metrics, labels): # 循环绘制三条曲线
sns.lineplot(
x='Discount', # x轴为折扣力度
y=metric, # y轴为对应的业务指标
label=label, # 设置图例标签
data=profit_filtered # 使用过滤后的数据
)
plt.legend() # 显示图例,区分不同指标
plt.xlabel('折扣', fontsize=12) # 设置x轴标签
plt.ylabel('数值', fontsize=12) # 设置y轴标签
plt.title('折扣与业务指标关系', fontsize=14) # 设置图表标题
plt.grid(True, alpha=0.3) # 显示网格线,透明度0.3,辅助读图
plt.tight_layout() # 自动调整布局
plt.show() # 显示图表26.4 分析结论
关键发现:
- 利润拐点: 折扣20%是利润正负的拐点
- 折扣<20%: 利润为正
- 折扣>20%: 利润为负
- 最优折扣: 0.2%和7%折扣时,单位时间利润显著提升
- 低折扣”小刀”策略刺激购买
- 提升销量和利润
- 极端折扣: 85%, 55%, 57%出现极端负利润
- 特殊商品的引流活动
- 不具备代表性
26.5 商业建议
- 常规定价: 控制折扣在20%以内
- 促销策略: 小幅折扣(0.2%-7%)效果最佳
- 避免亏损: 谨慎使用高折扣促销
- 差异化定价: 不同品类采用不同折扣策略